home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 January / Macworld (1998-01).dmg / Shareware World / Comms & Internet / HTML mode 2.0 etc. / html.tcl < prev    next >
Text File  |  1997-09-22  |  33KB  |  927 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode 2.0: tools for editing HTML documents
  4.  # 
  5.  #  FILE: "html.tcl"
  6.  #                                    created: 95-04-26 14.49.04 
  7.  #                                last update: 97-09-22 20.18.59 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jl@theophys.kth.se>
  10.  #     www: <http://bach.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.0
  13.  # 
  14.  # version 0.24 (16 July 95) by Scott W. Brim <swb1@cornell.edu>
  15.  # version 1.0 -- 2.0 (September 97) by Johan Linde <jl@theophys.kth.se>
  16.  #
  17.  # Copyright 1996, 1997 by Johan Linde
  18.  #  
  19.  # This software may be used freely, and distributed freely, as long as the 
  20.  # receiver is not obligated in any way by receiving it.
  21.  #  
  22.  # If you make improvements to this file, please share them!
  23.  # 
  24.  # ###################################################################
  25.  ##
  26.  
  27. # ◊◊◊◊ Change below for new system §0 ◊◊◊◊ #
  28. # ◊◊◊◊ end changing for new system §0 ◊◊◊◊ #
  29.  
  30. # called by Alpha to load HTML in.  
  31. proc htmlDummy {} {}
  32. proc htmlMenu {} {}
  33. proc htmlUtilsMenu {} {}
  34.  
  35. #===============================================================================
  36. # Global variables and their management
  37. #===============================================================================
  38.  
  39. # ◊◊◊◊ Change below for new system §1 ◊◊◊◊ #
  40.  
  41. # Line width
  42. newModeVar HTML fillColumn 75 0
  43. newModeVar HTML leftFillColumn 0 0
  44. # word breaking and word wrapping
  45. newModeVar HTML wordBreak {\w+} 0
  46. newModeVar HTML wordBreakPreface {(\W)} 0
  47. newModeVar HTML wrapBreak {[\w_]+} 0
  48. newModeVar HTML wrapBreakPreface {([^\w_])} 0
  49.  
  50. # Indentation
  51. newModeVar HTML indentHEAD 0 1
  52. newModeVar HTML indentBODY 0 1
  53. newModeVar HTML indentP 0 1
  54. newModeVar HTML indentDIV 0 1
  55. newModeVar HTML indentBLOCKQUOTE 0 1
  56. newModeVar HTML indentCENTER 0 1
  57. newModeVar HTML indentMULTICOL 0 1
  58. newModeVar HTML indentOBJECT 0 1
  59. newModeVar HTML indentNOEMBED 0 1
  60. newModeVar HTML indentOL 1 1
  61. newModeVar HTML indentUL 1 1
  62. newModeVar HTML indentDIR 1 1
  63. newModeVar HTML indentMENU 1 1
  64. newModeVar HTML indentDL 1 1
  65. newModeVar HTML indentFORM 0 1
  66. newModeVar HTML indentSELECT 0 1
  67. newModeVar HTML indentTABLE 1 1
  68. newModeVar HTML indentTR 1 1
  69. # newModeVar HTML indentTD 0 1
  70. newModeVar HTML indentFRAMESET 0 1
  71. newModeVar HTML indentNOFRAMES 0 1
  72. newModeVar HTML indentMAP 0 1
  73. newModeVar HTML indentAPPLET 0 1
  74. newModeVar HTML indentNOSCRIPT 0 1
  75. set htmlIndentElements {HEAD BODY P DIV BLOCKQUOTE CENTER MULTICOL OBJECT NOEMBED OL UL DIR MENU DL
  76. FORM SELECT TABLE TR FRAMESET NOFRAMES MAP APPLET NOSCRIPT}
  77.  
  78. # browsers
  79. if {![info exists browserSig] && [catch {getFileSig [icGetPref -t 1 Helper•http]} browserSig]} {set browserSig MOSS}
  80. newModeVar HTML browsers {MOSS MSIE} 0
  81.  
  82. newModeVar HTML wordWrap        1    1
  83. newModeVar HTML prefixString    "<!-- "    0
  84. newModeVar HTML suffixString    " -->"    0
  85.  
  86. # Paths to footer files.
  87. newModeVar HTML footers {} 0
  88. # Tag color
  89. newModeVar HTML tagColor        blue 0
  90. # Attribute color
  91. newModeVar HTML attributeColor magenta 0
  92. # Simple coloring?
  93. newModeVar HTML simpleColoring 0 1
  94. # Should elements be lower case?
  95. newModeVar HTML useLowerCase    0    1
  96. # Should •'s be inserted?
  97. newModeVar HTML    useTabMarks        1    1
  98. # Is <p> a container?
  99. newModeVar HTML pIsContainer    1    1
  100. # Are LI DT and DD containers 
  101. newModeVar HTML lidtAreContainers 0  1
  102. # A window cache with frames.
  103. newModeVar HTML windows        {}    0
  104. # When browser is launched, should it be brought to front?
  105. newModeVar HTML    browseInForeground    1    1
  106. # Save without asking when sending file to browser?
  107. newModeVar HTML saveWithoutAsking 0 1
  108. # list of commonly used character entities
  109. newModeVar HTML defaultCommonChars {"less than" "greater than" "ampersand"} 0
  110. newModeVar HTML commonChars $HTMLmodeVars(defaultCommonChars) 0
  111. # Which HTML package?
  112. newModeVar HTML htmlPackageToUse 1 0
  113. # Hide Netscape or MSIE only tags?
  114. newModeVar HTML hideNetscape 0 1
  115. newModeVar HTML hideIE 1 1
  116. # Include event handlers in attribute dialog?
  117. newModeVar HTML inclEventHandler 0  1
  118. # Include style sheet attributes in attribute dialog?
  119. newModeVar HTML hideStyleAttrs 1 1
  120. # Beep when asking for attributes in the status bar?
  121. newModeVar HTML promptNoisily 1 1
  122. # Input from big windows?
  123. newModeVar HTML useBigWindows 1 1
  124. # Change in big windows?
  125. newModeVar HTML changeInBigWindows 1 1
  126. # Settings in Use Attributes menu apply to dialogs?
  127. newModeVar HTML useAttsApplyToDialogs 0 1
  128. # Cmd-double-click on non text file link opens file?
  129. newModeVar HTML openNonTextFile 1 1
  130. # Return on non text file in home page window opens file?
  131. newModeVar HTML homeOpenNonTextFile 1 1
  132. # Check anchors in links
  133. newModeVar HTML checkAnchors 1 1
  134. # Case sensistive link checking?
  135. newModeVar HTML caseSensitive 0 1
  136. # Check links with Big Brother?
  137. newModeVar HTML useBigBrother 0 1
  138. newModeVar HTML checkInFront 1 1
  139. newModeVar HTML useBBoptions 1 1
  140. newModeVar HTML ignoreRemote 0 1
  141. newModeVar HTML ignoreLocal 0 1
  142. # Folder for HTML manual.
  143. newModeVar HTML manualFolder "$HOME:HTML mode manual" 0
  144. newModeVar HTML manualStartPage 0 0
  145. # FTP servers
  146. newModeVar HTML FTPservers {} 0
  147. # Last modified string
  148. newModeVar HTML lastModified "Last modified" 0
  149.  
  150. # JavaScript stuff
  151. newModeVar HTML JavaScriptColoring 0 1
  152. newModeVar HTML JavaScriptColor    magenta 0
  153. newModeVar HTML stringColor green 0
  154. newModeVar HTML JavaCommentColor red 0
  155. newModeVar HTML elecRBrace 1 1
  156. newModeVar HTML elecLBrace 1 1
  157. newModeVar HTML electricSemi 1 1
  158.  
  159. # CSS stuff
  160. newModeVar HTML CSSColoring 0 1
  161. newModeVar HTML CSSColor cyan 0
  162.  
  163. # ◊◊◊◊ end changing for new system §1 ◊◊◊◊ #
  164.  
  165. # These attributes are URLs.
  166. set htmlURLAttr    {HREF= SRC= LOWSRC= ACTION= USEMAP= BACKGROUND= CODEBASE= PLUGINSPAGE=
  167. DYNSRC= CLASSID= DATA=}
  168. # These element attributes are colors
  169. set htmlColorAttr    {BGCOLOR= TEXT= LINK= VLINK= ALINK= COLOR= BORDERCOLOR=
  170. BORDERCOLORDARK= BORDERCOLORLIGHT=}
  171. # These attributes are windows
  172. set htmlWindowAttr {TARGET=}
  173. # Special cases with URLs, colors and windows
  174. set htmlSpecURL {}
  175. set htmlSpecColor {}
  176. set htmlSpecWindow {}
  177. # These elements can be in document HEAD.
  178. set htmlHeadElements1 {BASE ISINDEX LINK META STYLE SCRIPT}
  179. set htmlHeadElements3 {BASE ISINDEX LINK META STYLE}
  180. # These elements are plug-ins.
  181. set htmlPlugins {EMBED LIVEAUDIO LIVEVIDEO "QUICKTIME MOVIE" "QUICKTIME VR" REALAUDIO}
  182. # HTML mode version
  183. set htmlVersion 2.0
  184.  
  185. # Register eventhandler for Big Brother events
  186. eventHandler Bbth Chkd htmlBbthChkdHandler 
  187.  
  188. # Used by fillParagraph
  189. set htmlParaCommands {html|head|title|body|h[1-6]|p|div|blockquote|center|address|pre|multicol}
  190. append htmlParaCommands {|br|hr|wbr|basefont|ul|ol|li|dir|menu|dl|dd|dt|form|input}
  191. append htmlParaCommands {|select|option|textarea|caption|table|tr|frameset|frame|noframes}
  192. append htmlParaCommands {|map|area|applet|param|script|noscript|layer|ilayer|nolayer|base|link|meta|isindex}
  193. append htmlParaCommands {|col|colgroup|marquee|object|thead|tbody|tfoot}
  194.  
  195. #
  196. # Internal Globals
  197. #
  198. set htmlCurSel    ""
  199. set htmlIsSel    0
  200. set htmlAdditionExist 0
  201. set htmlHomePageWinList {}
  202. set homeTime 0
  203. set htmlFTPing 0
  204. set htmlNumBbthChecking 0
  205.  
  206. # Load other HTML mode files.
  207. foreach tmp {htmlEngine htmlElems htmlUtils hctsmslShared hctsmslMenu htmlMenu} {
  208.     if {[info exists cssModeIsLoaded] && ($tmp == "hctsmslMenu" || $tmp == "hctsmslShared")} {continue}
  209.     if { [catch {eval ${tmp}.tcl}] } {
  210.         beep
  211.         alertnote "Loading of ${tmp}.tcl failed"
  212.         return
  213.     }
  214. }
  215.  
  216. if {(!$HTMLmodeVars(useBigWindows) || !$HTMLmodeVars(changeInBigWindows)) && [catch {htmlStatusBar.tcl}] } {
  217.     beep
  218.     alertnote "Loading of htmlStatusBar.tcl failed"
  219.     return
  220. }
  221.  
  222. # Silently add missing menu.
  223. if {[lsearch -exact $modeMenus(HTML) htmlMenu] >= 0 && [lsearch -exact $modeMenus(HTML) htmlUtilsMenu] < 0} {
  224.     lappend modeMenus(HTML) htmlUtilsMenu
  225. }
  226. if {[lsearch -exact $modeMenus(HTML) htmlMenu] < 0 && [lsearch -exact $modeMenus(HTML) htmlUtilsMenu] >= 0} {
  227.     lappend modeMenus(HTML) htmlMenu
  228. }
  229.  
  230. # Clean up tmp files
  231. if {[file exists $PREFS:HTMLtmp]} {catch {rm $PREFS:HTMLtmp:*}}
  232.  
  233. # Clean up after version 2.0b1
  234. if {[info exists htmlMenuKey]} {
  235.     foreach tmp [array names htmlMenuKey] {
  236.         removeArrDef htmlMenuKey $tmp
  237.     }
  238.     htmlWriteMenuKeys
  239. }
  240.  
  241.  
  242. #
  243. # Read custom elements
  244. #
  245.  
  246. proc htmlReadAdditions {} {
  247.     global PREFS htmlElemAttrRequired1 htmlElemAttrOptional1 htmlElemAttrChoices1
  248.     global htmlElemAttrNumber1 htmlElemEventHandler1 htmlElemKeyBinding htmlElemProc
  249.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlPlugins
  250.     global htmlSpecURL htmlSpecColor htmlSpecWindow htmlVersion htmlShownWarning
  251.  
  252.     htmlExtensions.tcl
  253.     message "Loading custom elements…"
  254.     
  255.     
  256.     if {[catch {open $PREFS:HTMLadditions.tcl r} fid]} {
  257.         alertnote "Could not open the file HTMLAdditions.tcl with your custom elements."
  258.         return
  259.     }
  260.     set additions [read -nonewline $fid]
  261.     close $fid
  262.     set lines [split $additions "\n"]
  263.     set version [lindex $lines 0]
  264.     if {$version == $htmlVersion} {htmlReadAdditions0 $lines; return}
  265.     if {$version > $htmlVersion} {
  266.         regsub "\[^\n\]+" $additions $htmlVersion additions
  267.         set fid [open $PREFS:HTMLadditions.tcl w]
  268.         puts $fid $additions
  269.         close $fid
  270.         htmlReadAdditions0 $lines
  271.         return
  272.     }
  273.     set allattrs [htmlGetAllAttrs]
  274.     set newLines "$htmlVersion\n"
  275.     set changed 0
  276.     set tmpSpecURL ""
  277.     set tmpSpecColor ""
  278.     set tmpSpecWindow ""
  279.     foreach line [lrange $lines 1 end] {
  280.         set elem [lindex $line 0]
  281.         set command [lindex $line 1]
  282.         set elemExists [info exists htmlElemAttrOptional1($elem)]
  283.         if {$elemExists} {
  284.             foreach x [list AttrOptional1 AttrRequired1 AttrNumber1 AttrChoices1 EventHandler1] {
  285.                 if {[info exists htmlElem${x}($elem)]} {
  286.                     set $x [string toupper [set htmlElem${x}($elem)]]
  287.                 } else {
  288.                     set $x ""
  289.                 }
  290.             }
  291.             set attrs [concat $AttrOptional1 $AttrRequired1 $EventHandler1]
  292.             foreach at $attrs {
  293.                 if {[string trimright $at =] == $at} {
  294.                     lappend attrs "${at}="
  295.                 } else {
  296.                     lappend attrs [string trimright $at =]
  297.                 }
  298.             }
  299.         } else {
  300.             set attrs {}
  301.         }
  302.         set var [lindex $command 1]
  303.         foreach ucw [list URL Color Window] {
  304.             if {$var == "html${ucw}Attr"} {
  305.                 set att [lindex $command 2]
  306.                 if {[lsearch -exact [set html${ucw}Attr] $att] >=0} {
  307.                     # Already defined.
  308.                     set changed 1
  309.                 } elseif {[lsearch -exact $allattrs $att] >=0 || [lsearch -exact $allattrs [string trimright $att =]] >=0} {
  310.                     # Used for some other kind of attr.
  311.                     lappend ${ucw}SpecMaybe $att
  312.                     set changed 1
  313.                 } elseif {[lsearch -exact $attrs $att] >= 0} {
  314.                     # Attr already exists for elem.
  315.                     lappend ${ucw}Maybe $att
  316.                     set changed 1
  317.                 } else {
  318.                     append newLines "$line\n"
  319.                 }
  320.             }
  321.             if {$var == "htmlSpec${ucw}"} {
  322.                 set tmpadd [lrange $command 2 end]
  323.                 foreach x $tmpadd {
  324.                     regexp {[^!=]!?=(.*)} $x dum tmp
  325.                     # Only add if attr doesn't exist.
  326.                     if {[lsearch -exact $attrs $tmp] >= 0} {
  327.                         set changed 1
  328.                         set where [lsearch -exact $tmpadd $x]
  329.                         set tmpadd [lreplace $tmpadd $where $where]
  330.                     }
  331.                 }
  332.                 if {[llength $tmpadd]} {
  333.                     append newLines "[list $elem] \{lappend htmlSpec${ucw} $tmpadd\}\n"
  334.                     append tmpSpec${ucw} " " $tmpadd
  335.                 }
  336.             }
  337.         }
  338.         if {[lsearch {htmlURLAttr htmlColorAttr htmlWindowAttr htmlSpecURL \
  339.         htmlSpecColor htmlSpecWindow} $var] < 0} {
  340.             # If element doesn't exist, GO!
  341.             if {!$elemExists} {
  342.                 append newLines "$line\n"
  343.                 regsub "html" $command "tmp" command
  344.                 eval $command
  345.                 continue
  346.             }
  347.             # Skip these vars if element exists.
  348.             if {[string match "htmlElemKeyBinding*" $var] || [string match "htmlElemProc*" $var] ||
  349.             $var == "htmlPlugins"} {
  350.                 set changed 1
  351.                 continue
  352.             }
  353.             regexp {([^\(]+)\(([^\)]+)\)[ ]+(.+)} [lrange $command 1 end] dummy var arg added
  354.             set added [string trimleft [string trimright $added \}] \{]
  355.             foreach c $added {
  356.                 if {$var == "htmlElemAttrChoices1"} {
  357.                     regexp {[^=]*=} $c tmp
  358.                     # Don't add choices if they exist or if attr isn't a choice attr.
  359.                     if {[lsearch -exact $AttrChoices1 $c] >= 0 || ([lsearch -exact $attrs $tmp] >= 0 &&
  360.                     [lsearch $AttrChoices1 "${tmp}*"] < 0) } {
  361.                         set changed 1
  362.                         set where [lsearch -exact $added $c]
  363.                         set added [lreplace $added $where $where]
  364.                     }
  365.                 } else {
  366.                     if {$var == "htmlElemAttrNumber1"} {
  367.                         regexp {[^=]*=} $c tmp
  368.                     } else {
  369.                         set tmp [string toupper $c]
  370.                     }
  371.                     # Don't add attrs which exist.
  372.                     if {[lsearch -exact $attrs $tmp] >= 0} {
  373.                         set changed 1
  374.                         set where [lsearch -exact $added $c]
  375.                         set added [lreplace $added $where $where]
  376.                     }
  377.                 }
  378.             }
  379.             if {[llength $added]} {
  380.                 append newLines "[list $elem] \{lappend ${var}($arg) $added\}\n"
  381.                 regsub "html" $var "tmp" var
  382.                 eval "lappend ${var}($arg) $added"
  383.             }
  384.         }
  385.     }
  386.     foreach ucw [list URL Color Window] {
  387.         if {[info exists ${ucw}SpecMaybe]} {
  388.             foreach m [set ${ucw}SpecMaybe] {
  389.                 foreach e [array names tmpElemAttrRequired1] {
  390.                     if {[lsearch -exact $tmpElemAttrRequired1($e) $m] >= 0 && \
  391.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  392.                         append newLines "[list $e] \{lappend htmlSpec${ucw} ${e}=[string trimright $m =]\}\n"
  393.                     } 
  394.                 }
  395.                 foreach e [array names tmpElemAttrOptional1] {
  396.                     if {[lsearch -exact $tmpElemAttrOptional1($e) $m] >= 0 && \
  397.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  398.                         append newLines "[list $e] \{lappend htmlSpec${ucw} ${e}=[string trimright $m =]\}\n"
  399.                     } 
  400.                 }
  401.             }
  402.         }
  403.         if {[info exists ${ucw}Maybe]} {
  404.             foreach m [set ${ucw}Maybe] {
  405.                 set foundit 0
  406.                 foreach e [array names tmpElemAttrRequired1] {
  407.                     if {[lsearch -exact $tmpElemAttrRequired1($e) $m] >= 0 && \
  408.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  409.                         append newLines "[list $e] \{lappend html${ucw}Attr $m\}\n"
  410.                         set foundit 1
  411.                         break
  412.                     } 
  413.                 }
  414.                 if {$foundit} {continue}
  415.                 foreach e [array names tmpElemAttrOptional1] {
  416.                     if {[lsearch -exact $tmpElemAttrOptional1($e) $m] >= 0 && \
  417.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  418.                         append newLines "[list $e] \{lappend html${ucw}Attr $m\}\n"
  419.                         break
  420.                     } 
  421.                 }
  422.             }
  423.         }    
  424.     }
  425.     
  426.     if {$newLines != "$htmlVersion\n"} {htmlReadAdditions0 [split [string trimright $newLines "\n"] "\n"]}
  427.     if {$changed} {
  428.         beep
  429.         if {[lindex [dialog -w 300 -h 270 -b "Clean up" 20 240 100 260 \
  430.         -b "Leave it" 120 240 200 260 -t "Some of your custom elements are supported by this\
  431.         version of HTML mode." 10 10 290 45 -t "Choose 'Clean up' to update your file with custom\
  432.         elements and to avoid this alert next time you run Alpha.\
  433.         If you do so, some elements will not be defined correctly if you go back to\
  434.         a previous version of HTML mode." 10 50 290 150 -t "Choose 'Leave it' to leave your file\
  435.         with custom elements untouched. If you do so, the submenu 'Extend', where you can add new custom\
  436.         elements, will be disabled." 10 160 290 225] 1]} {
  437.             set htmlShownWarning 1
  438.             return
  439.         }
  440.     }
  441.     if {$newLines == "$htmlVersion\n"} {
  442.         removeFile $PREFS:HTMLadditions.tcl
  443.     } else {
  444.         set fid [open $PREFS:HTMLadditions.tcl w]
  445.         puts -nonewline $fid $newLines
  446.         close $fid
  447.     }
  448. }
  449.  
  450. proc htmlReadAdditions0 {lines} {
  451.     global htmlElemAttrRequired1 htmlElemAttrOptional1 htmlElemAttrChoices1
  452.     global htmlElemAttrNumber1 htmlElemEventHandler1 htmlElemKeyBinding htmlElemProc
  453.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlPlugins
  454.     global htmlSpecURL htmlSpecColor htmlSpecWindow htmlAdditionExist htmlShownWarning
  455.     
  456.     foreach line [lrange $lines 1 end] {
  457.         if {[catch {eval [lindex $line 1]}]} {
  458.             alertnote "There is an error in the file HTMLAdditions.tcl with your custom elements."
  459.             set htmlShownWarning 1
  460.             break
  461.         }
  462.     }
  463.     set htmlAdditionExist 1
  464. }
  465.  
  466. #
  467. # Color support
  468. #
  469.  
  470. proc htmlColorizing {{changing 0}} {
  471.      global HTMLmodeVars HTMLwords htmlElemAttrOptional1 htmlElemAttrRequired1
  472.      global htmlElemEventHandler1 PREFS htmlElemKeyBinding
  473.      
  474.      set HTMLKeyWords {}
  475.     if {[info exists HTMLwords]} {set HTMLKeyWords $HTMLwords}
  476.  
  477.     if {!$HTMLmodeVars(simpleColoring)} {
  478.         # All HTML elements
  479.         set allHTMLwords [concat {A ADDRESS APPLET AREA B BASE BASEFONT 
  480.         BGSOUND BIG BLINK BLOCKQUOTE BODY BR 
  481.         CAPTION CENTER CITE CODE COL COLGROUP DD DFN DIR DIV DL DT EM EMBED FONT 
  482.         FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME ILAYER IMG 
  483.         INPUT ISINDEX KBD KEYGEN LAYER LI LINK MAP MARQUEE MENU META MULTICOL NOBR 
  484.         NOEMBED NOFRAMES NOLAYER NOSCRIPT OBJECT OL OPTION P PARAM PRE SAMP SCRIPT 
  485.         SELECT SMALL SPACER SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD 
  486.         TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR WBR} [array names htmlElemKeyBinding]]
  487.     
  488.         foreach elem $allHTMLwords {
  489.             lappend allHTMLkeywords "<${elem}" "/${elem}"
  490.         }
  491.         # All attributes
  492.         set attributeWords {ABOVE= ACTION= ALIGN= ALINK= ALT= ARCHIVE= 
  493.         AUTOPLAY= AUTOSTART= BACKGROUND= 
  494.         BEHAVIOR= BELOW= BGCOLOR= BGPROPERTIES= BORDER= BORDERCOLOR= 
  495.         BORDERCOLORDARK= BORDERCOLORLIGHT= CELLPADDING= CELLSPACING= CHALLENGE= 
  496.         CHECKED CLASS= CLASSID= CLEAR= CLIP= CODE= CODEBASE= CODETYPE= COLOR= COLS= 
  497.         COLSPAN= COMPACT CONSOLE= CONTENT= CONTROLLER= CONTROLS CONTROLS= COORDS= 
  498.         CORRECTION= DATA= DECLARE DIRECTION= DYNSRC= ENCTYPE= FACE= FOV= FRAME= 
  499.         FRAMEBORDER= FRAMESPACING= GUTTER= HEIGHT= HIDDEN= HREF= HSPACE= 
  500.         HTTP-EQUIV= ID= ISMAP LANGUAGE= LEFT= LEFTMARGIN= LINK= LOOP= LOWSRC= 
  501.         MARGINHEIGHT= MARGINWIDTH= MAXLENGTH= MAYSCRIPT METHOD= MULTIPLE NAME= 
  502.         NODE= NOHREF NOLABELS= NORESIZE NOSHADE NOWRAP PAGEX= PAGEY= PAN= 
  503.         PLAYEVERYFRAME= PLUGINSPAGE= POINT-SIZE= PROMPT= REL= REV= ROWS= ROWSPAN= 
  504.         RULES= SCROLLAMOUNT= SCROLLDELAY= SCROLLING= SELECTED SHAPE= SHAPES SIZE= 
  505.         SPAN= SRC= STANDBY= START= STYLE= TARGET= TEXT= TILT= TITLE= TOP= 
  506.         TOPMARGIN= TYPE= USEMAP= VALIGN= VALUE= VALUETYPE= VISIBILITY= VLINK= 
  507.         VSPACE= WIDTH= WRAP= Z-INDEX=}
  508.         # Custom element attributes
  509.         if {[file exists $PREFS:HTMLadditions.tcl] && ![catch {open $PREFS:HTMLadditions.tcl} fid]} {
  510.             set lines [lrange [split [read -nonewline $fid] "\n"] 1 end]
  511.             close $fid
  512.             foreach line $lines {
  513.                 set cmd [lindex $line 1]
  514.                 set added ""
  515.                 regexp {([^\(]+)\(([^\)]+)\)[ ]+(.+)} [lrange $cmd 1 end] dummy var arg added
  516.                 set added [string trimleft [string trimright $added \}] \{]
  517.                 if {$var == "htmlElemAttrRequired1" || $var == "htmlElemAttrOptional1"} {
  518.                     foreach attr $added {
  519.                         if {[lsearch -exact $attributeWords $attr] < 0} {
  520.                             lappend attributeWords $attr
  521.                         }
  522.                     }
  523.                 }
  524.             }
  525.         }
  526.         # A few other words.
  527.         lappend allHTMLkeywords "<!--" "-->" "#INCLUDE" "/#INCLUDE" \
  528.         "#LASTMODIFIED" "/#LASTMODIFIED" "#DOCINDEX" "/#DOCINDEX"
  529.         lappend attributeWords "FILE=" "FORM="
  530.         # JavaScript keywords.
  531.         set JavaScriptWords {break case continue default do for in function if else new return switch this var while with true false }
  532.         foreach elem [array names htmlElemEventHandler1] {
  533.             foreach event $htmlElemEventHandler1($elem) {
  534.                 if {[lsearch -exact $JavaScriptWords $event] < 0} {
  535.                     lappend JavaScriptWords $event
  536.                 }
  537.             }
  538.         }
  539.         # CSS keywords
  540.         set CSSwords {font-family font-style font-variant font-weight font-size font 
  541.         color background-color background-image background-repeat background-attachment
  542.         background-position background word-spacing letter-spacing text-decoration
  543.         vertical-align text-transform text-align text-indent line-height
  544.         margin-top margin-right margin-bottom margin-left margin padding-top padding-right
  545.         padding-bottom padding-left padding border-top-width border-right-width
  546.         border-bottom-width border-left-width border-width border-color border-style
  547.         border-top border-right border-bottom border-left border width height float clear
  548.         display white-space list-style-type list-style-image list-style-position list-style
  549.         @import important}
  550.         
  551.         if {!$changing} {
  552.             regModeKeywords -i "<" -i ">" -I $HTMLmodeVars(tagColor) \
  553.                 -s $HTMLmodeVars(stringColor)  -b "/*" "*/" -e "//" HTML {}
  554.         }
  555.         if {$HTMLmodeVars(JavaScriptColoring) || $HTMLmodeVars(CSSColoring)} {
  556.             set col $HTMLmodeVars(JavaCommentColor)
  557.         } else {
  558.             set col none
  559.         }
  560.         regModeKeywords -a -c $col HTML
  561.         if {$HTMLmodeVars(JavaScriptColoring)} {
  562.             set col $HTMLmodeVars(JavaScriptColor)
  563.         } else {
  564.             set col none
  565.         }
  566.         regModeKeywords -a -k $col HTML $JavaScriptWords
  567.         if {$HTMLmodeVars(CSSColoring)} {
  568.             set col $HTMLmodeVars(CSSColor)
  569.         } else {
  570.             set col none
  571.         }
  572.         regModeKeywords -a -k $col HTML $CSSwords
  573.         regModeKeywords -a -k $HTMLmodeVars(tagColor) \
  574.         HTML [concat $HTMLKeyWords $allHTMLkeywords]
  575.         regModeKeywords -a -k $HTMLmodeVars(attributeColor) HTML $attributeWords
  576.     } else {
  577.         regModeKeywords -b "<" ">" -c $HTMLmodeVars(tagColor) \
  578.         -k $HTMLmodeVars(tagColor) HTML $HTMLKeyWords
  579.     }
  580. }
  581.  
  582. # Change color when a color variable is changed.
  583. proc htmlChangeColorizing {flag} {
  584.     global HTMLmodeVars
  585.     set msg 0
  586.     switch -glob $flag {
  587.         simpleColoring {
  588.             htmlColorizing
  589.             set msg 1
  590.         }
  591.         JavaScriptColoring -
  592.         attributeColor -
  593.         CSSColoring {
  594.             if {!$HTMLmodeVars(simpleColoring)} {
  595.                 htmlColorizing 1
  596.             }
  597.         }
  598.         tagColor {
  599.             if {$HTMLmodeVars(simpleColoring)} {
  600.                 regModeKeywords -a -c $HTMLmodeVars(tagColor) HTML
  601.             } else {
  602.                 regModeKeywords -a -i "<" -i ">" -I $HTMLmodeVars(tagColor) HTML
  603.                 htmlColorizing 1
  604.             }
  605.         }
  606.         JavaScriptColor {
  607.             if {$HTMLmodeVars(JavaScriptColoring) && !$HTMLmodeVars(simpleColoring)} {
  608.                 htmlColorizing 1
  609.             }
  610.         }
  611.         JavaCommentColor {
  612.             if {($HTMLmodeVars(JavaScriptColoring) || $HTMLmodeVars(CSSColoring)) && !$HTMLmodeVars(simpleColoring)} {
  613.                 regModeKeywords -a -c $HTMLmodeVars(JavaCommentColor) HTML
  614.             }
  615.         }
  616.         CSSColor {
  617.             if {$HTMLmodeVars(CSSColoring) && !$HTMLmodeVars(simpleColoring)} {
  618.                 htmlColorizing 1
  619.             }
  620.         }    
  621.         stringColor {
  622.             if {!$HTMLmodeVars(simpleColoring)} {
  623.                 regModeKeywords -a -s $HTMLmodeVars(stringColor) HTML
  624.             }
  625.         }
  626.     }
  627.     htmlRedraw
  628.     if {$msg} {message "Coloring may not change until you switch to another window."}
  629. }
  630.  
  631. proc htmlShadowAttrUse {args} {
  632.     global HTMLmodeVars htmlMenu
  633.     enableMenuItem $htmlMenu "Use Attributes…" [htmlUseAttrsIsEnabled]
  634. }
  635.  
  636. trace variable HTMLmodeVars(useBigWindows) w htmlShadowAttrUse
  637. trace variable HTMLmodeVars(changeInBigWindows) w htmlShadowAttrUse
  638. trace variable HTMLmodeVars(useAttsApplyToDialogs) w htmlShadowAttrUse
  639. trace variable browserSig w htmlToggleBrowser2
  640.  
  641. # Dialog to set HTML mode variables.
  642. proc HTMLmodifyFlags {{which General}} {
  643.     global HTMLmodeVars modifiedModeVars
  644.     
  645.     set box [eval html${which}PrefsBox]
  646.     set allFlags [eval html${which}Flags]
  647.  
  648.     set attrTxt {"status bar" "dialog boxes"}
  649.     set manTxt {"first page in manual" "table of contents without frames" "table of contents with frames"}
  650.     set values [eval [concat dialog -w 460 -h 315 -b OK 20 285 85 305 -b Cancel 110 285 175 305 $box]]
  651.     if {[lindex $values 1]} {return}
  652.     set i 1
  653.     if {$which == "General"} {incr i}
  654.     foreach flag $allFlags {
  655.         global $flag
  656.         incr i
  657.         set val [lindex $values $i]
  658.         if {$flag == "useBigWindows" || $flag == "changeInBigWindows"} {set val [lsearch -exact $attrTxt $val]}
  659.         if {$flag == "manualStartPage"} {set val [lsearch -exact $manTxt $val]}
  660.         if {$HTMLmodeVars($flag) != $val} {
  661.             set $flag $val
  662.             set HTMLmodeVars($flag) $val
  663.             lappend modifiedModeVars [list $flag HTMLmodeVars]
  664.             if {[string match "*Color*" $flag]} {htmlChangeColorizing $flag}
  665.         }
  666.     }
  667. }
  668.  
  669. proc htmlGeneralPrefsBox {} {
  670.     global HTMLmodeVars colorInds
  671.     
  672.     set colors {none blue cyan green magenta red white yellow}
  673.     foreach c [lsort [array names colorInds]] {
  674.         if {[regexp {color} $c]} {lappend colors $c}
  675.     }
  676.     set attrTxt {"status bar" "dialog boxes"}
  677.     set manTxt {"first page in manual" "table of contents without frames" "table of contents with frames"}
  678.  
  679.     set box "-t {General HTML mode Preferences} 100 10 450 30 \
  680.     -m {{Page 1 of preferences} {Page 1 of preferences} {Page 2 of preferences}} 100 35 300 55 \
  681.     -n {Page 1 of preferences} \
  682.     -c {Bring browser to front when sending a window to it} $HTMLmodeVars(browseInForeground) 10 65 450 80\
  683.     -c {Save window without asking when sending it to the browser} $HTMLmodeVars(saveWithoutAsking) 10 85 450 100 \
  684.     -c {Set tags in lower case} $HTMLmodeVars(useLowerCase) 10 105 200 120 \
  685.     -c {Use tab marks (•)} $HTMLmodeVars(useTabMarks) 10 125 450 140 \
  686.     -c {<P> has a closing tag </P>} $HTMLmodeVars(pIsContainer) 10 145 450 160 \
  687.     -c {<LI>, <DT> and <DD> have closing tags} $HTMLmodeVars(lidtAreContainers) 10 165 450 180 \
  688.     -t {Give attributes in}  10 185 150 200\
  689.     -m {[list [lindex $attrTxt $HTMLmodeVars(useBigWindows)]] {dialog boxes} {status bar}} 155 185 450 205 \
  690.     -t {Change attributes in} 10 210 150 225 \
  691.     -m {[list [lindex $attrTxt $HTMLmodeVars(changeInBigWindows)]] {dialog boxes} {status bar}} 155 210 450 230 \
  692.     -c {Beep for each attribute (applies only if you use the status bar)} $HTMLmodeVars(promptNoisily) 10 235 450 250 \
  693.     -c {Settings in 'Use Attributes…' also apply to attribute dialogs} $HTMLmodeVars(useAttsApplyToDialogs) 10 255 450 270 \
  694.     -n {Page 2 of preferences} \
  695.     -c {Simple coloring} $HTMLmodeVars(simpleColoring) 10 65 450 80 \
  696.     -t {Color of HTML tags:} 10 85 150 100 \
  697.     -m [list [concat $HTMLmodeVars(tagColor) $colors]] 160 85 310 105 \
  698.     -t {Color of attributes:} 10 110 150 125 \
  699.     -m [list [concat $HTMLmodeVars(attributeColor) $colors]] 160 110 310 130 \
  700.     -t {Color of strings:} 10 135 150 150 \
  701.     -m [list [concat $HTMLmodeVars(stringColor) $colors]] 160 135 310 155 \
  702.     -t {'Help' opens} 10 160 95 175 \
  703.     -m {[concat [list [lindex $manTxt $HTMLmodeVars(manualStartPage)]] $manTxt]} 100 160 450 180 \
  704.     -c {Cmd-double-clicking on non-text file link opens file} $HTMLmodeVars(openNonTextFile) 10 190 450 205 \
  705.     -c {Return on non-text file in home page window opens file} $HTMLmodeVars(homeOpenNonTextFile) 10 210 450 225 \
  706.     -t {'Last modified' text} 10 235 150 255 -e [list $HTMLmodeVars(lastModified)] 160 235 450 250"
  707.  
  708.     return $box
  709. }
  710.  
  711. proc htmlGeneralFlags {} {
  712.     return [list browseInForeground saveWithoutAsking useLowerCase useTabMarks pIsContainer lidtAreContainers \
  713.     useBigWindows changeInBigWindows promptNoisily useAttsApplyToDialogs simpleColoring \
  714.     tagColor attributeColor stringColor manualStartPage openNonTextFile homeOpenNonTextFile lastModified]
  715. }
  716.  
  717. proc htmlIndentationPrefsBox {} {
  718.     global HTMLmodeVars htmlIndentElements
  719.     set box "-t {HTML mode Indentation Preferences} 100 10 450 30 \
  720.     -t {Indent the content of} 10 40 450 55"
  721.     set ww 70; set hh 10
  722.     foreach ind $htmlIndentElements {
  723.         append box " -c $ind $HTMLmodeVars(indent${ind}) $hh $ww [expr $hh + 100] [expr $ww + 15]"
  724.         incr ww 20
  725.         if {$ww > 200} {
  726.             set ww 70
  727.             incr hh 110
  728.         }
  729.     }
  730.     return $box
  731. }
  732.  
  733. proc htmlIndentationFlags {} {
  734.     global htmlIndentElements
  735.     foreach ind $htmlIndentElements {
  736.         lappend allFlags indent$ind
  737.     }
  738.     return $allFlags
  739. }    
  740.  
  741. proc htmlJavaScriptPrefsBox {} {
  742.     global HTMLmodeVars colorInds
  743.     set colors {none blue cyan green magenta red white yellow}
  744.     foreach c [lsort [array names colorInds]] {
  745.         if {[regexp {color} $c]} {lappend colors $c}
  746.     }
  747.     set box "-t {HTML mode JavaScript and CSS Preferences} 100 10 450 30 \
  748.     -c {Electric left braces} $HTMLmodeVars(elecLBrace) 10 35 450 50 \
  749.     -c {Electric right braces} $HTMLmodeVars(elecRBrace) 10 55 450 70 \
  750.     -c {Electric semicolon} $HTMLmodeVars(electricSemi) 10 75 450 90 \
  751.     -c {Color JavaScript keywords} $HTMLmodeVars(JavaScriptColoring) 10 95 450 110\
  752.     -c {Include event handlers in attribute dialog} $HTMLmodeVars(inclEventHandler) 10 115 450 130 \
  753.     -t {Color of JavaScript keywords:} 10 135 215 150 \
  754.     -m [list [concat $HTMLmodeVars(JavaScriptColor) $colors]] 220 135 360 155 \
  755.     -c {Color CSS keywords} $HTMLmodeVars(CSSColoring) 10 165 450 180\
  756.     -t {Color of CSS keywords:} 10 185 215 200 \
  757.     -m [list [concat $HTMLmodeVars(CSSColor) $colors]] 220 185 360 205 \
  758.     -t {Color of JavaScript and CSS comments:} 10 210 270 225 \
  759.     -m [list [concat $HTMLmodeVars(JavaCommentColor) $colors]] 275 210 420 230"
  760.     
  761.     return $box
  762. }
  763.  
  764. proc htmlJavaScriptFlags {} {
  765.     return [list  elecLBrace elecRBrace electricSemi\
  766.     JavaScriptColoring inclEventHandler JavaScriptColor CSSColoring CSSColor JavaCommentColor]
  767. }
  768.  
  769. proc htmlCheckingPrefsBox {} {
  770.     global HTMLmodeVars
  771.     set box "-t {HTML mode Checking Links Preferences} 100 10 450 30 \
  772.     -t {These settings apply when you check links with Alpha:} 10 40 450 55 \
  773.     -c {Check anchors} $HTMLmodeVars(checkAnchors) 10 60 450 75 \
  774.     -c {Case sensitive checking (slower)} $HTMLmodeVars(caseSensitive) 10 80 450 95 \
  775.     -t {These settings apply when you check links with Big Brother:} 10 105 450 120\
  776.     -c {Bring Big Brother to front when checking links} $HTMLmodeVars(checkInFront) 10 125 450 140\
  777.     -c {Use Big Brother's link check options} $HTMLmodeVars(useBBoptions) 10 145 450 160\
  778.     -c {Ignore remote links (if you don't use Big Brother's option)} $HTMLmodeVars(ignoreRemote) 30 165 450 180\
  779.     -c {Ignore local links (if you don't use Big Brother's option)} $HTMLmodeVars(ignoreLocal) 30 185 450 200"
  780.     return $box
  781. }
  782.  
  783. proc htmlCheckingFlags {} {
  784.     return [list checkAnchors caseSensitive checkInFront useBBoptions ignoreRemote ignoreLocal]
  785. }
  786.  
  787. proc htmlWordPrefsBox {} {
  788.     global HTMLmodeVars
  789.     set box "-t {HTML mode Word Wrapping Preferences} 100 10 450 30 \
  790.     -t {Line width:} 10 40 90 55 -e [list $HTMLmodeVars(fillColumn)] 100 40 140 55 \
  791.     -t characters 145 40 300 55 \
  792.     -t {The variables below determine which characters build up words, and the word wrapping. Normally\
  793.     there is no need to change them. Read about them in general manual if you want to change them.} \
  794.     10 70 450 130 \
  795.     -t wordBreak: 10 140 150 155 -e [list $HTMLmodeVars(wordBreak)] 155 140 450 155 \
  796.     -t wordBreakPreface: 10 165 150 180 -e [list $HTMLmodeVars(wordBreakPreface)] 155 165 450 180 \
  797.     -t wrapBreak: 10 190 150 205 -e [list $HTMLmodeVars(wrapBreak)] 155 190 450 205 \
  798.     -t wrapBreakPreface: 10 215 150 230 -e [list $HTMLmodeVars(wrapBreakPreface)] 155 215 450 230"
  799. }
  800.  
  801. proc htmlWordFlags {} {
  802.     return [list fillColumn wordBreak wordBreakPreface wrapBreak wrapBreakPreface]
  803. }
  804.  
  805. if {[file exists $PREFS:HTMLadditions.tcl]} {
  806.     if {[catch {htmlReadAdditions}]} {alertnote "An error occured while reading your custom elements."}
  807. }
  808. rename htmlReadAdditions ""
  809. rename htmlReadAdditions0 ""
  810. htmlBuildMenu
  811. htmlBuildUtilsMenu
  812. htmlColorizing
  813. # Check that all home page folders exist.
  814. set tmp_notfind ""
  815. foreach tmp_hp $HTMLmodeVars(homePages) {
  816.     if {![file exists [lindex $tmp_hp 0]] || ![file isdirectory [lindex $tmp_hp 0]]} {
  817.         alertnote "Can't find the folder for the home page [lindex $tmp_hp 1][lindex $tmp_hp 2]"
  818.         set tmp_notfind "[lindex $tmp_hp 1][lindex $tmp_hp 2]"
  819.     }
  820. }
  821. if {$tmp_notfind != ""} {htmlHomePages $tmp_notfind}
  822. catch {unset tmp tmp_notfind tmp_hp}
  823.  
  824. # Define a couple of key bindings.
  825. bind ','    <zso>    {htmlInsertCharacter "less than"} HTML
  826. bind '.'    <zso>    {htmlInsertCharacter "greater than"} HTML
  827. bind '7'     <zso>    {htmlInsertCharacter ampersand}    HTML
  828. bind 0x31      <zso>    {htmlInsertCharacter "nonbreak space"}    HTML
  829. bind '\{' <s> htmlLeftBrace HTML
  830. bind '\}' <s> htmlRightBrace HTML
  831.  
  832. # Comment line
  833. bind 'l' <C>  htmlCommentLine HTML
  834.  
  835. # ◊◊◊◊ Change below for new system §2 ◊◊◊◊ #
  836.  
  837. if {[info commands useUniversalCompletions] == ""} {
  838.     # No Vince's Additions
  839.     bind '\r' HTMLcarriageReturn HTML
  840.     bind '\;' HTMLelectricSemi HTML
  841.  
  842.     # Option-click in titlebar    
  843.     # Rename old procs if they exist.
  844.     if {![info exists htmlModeIsLoaded] && [info commands getIncludeFiles] != "" && [info commands htmlGetIncludeFiles] == ""} {rename getIncludeFiles htmlGetIncludeFiles}
  845.     if {![info exists htmlModeIsLoaded] && [info commands editIncludeFile] != "" && [info commands htmleditIncludeFile] == ""} {rename editIncludeFile htmleditIncludeFile}
  846.     
  847.     # Called when option-clicking on titlebar.
  848.     proc getIncludeFiles {} {
  849.         global mode
  850.         if {$mode != "HTML"} {return [htmlGetIncludeFiles]}
  851.         return [htmlGetAttributes]
  852.     }
  853.     
  854.     # Called when selecting from the menu in the titlebar.
  855.     proc editIncludeFile {arg} {
  856.         global mode
  857.         if {$mode != "HTML"} {return [htmleditIncludeFile $arg]}
  858.         htmlInsertAttributes $arg
  859.     }
  860.     
  861.     proc htmlLeftBrace {} {
  862.         global HTMLmodeVars
  863.         set old $HTMLmodeVars(elecLBrace)
  864.         if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  865.             set HTMLmodeVars(elecLBrace) 0
  866.         }
  867.         catch {electricLeft}
  868.         set HTMLmodeVars(elecLBrace) $old
  869.     }
  870.     proc htmlRightBrace {} {
  871.         global HTMLmodeVars
  872.         set old $HTMLmodeVars(elecRBrace)
  873.         if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  874.             set HTMLmodeVars(elecRBrace) 0
  875.         }
  876.         catch {electricRight}
  877.         set HTMLmodeVars(elecRBrace) $old
  878.     }
  879.     
  880. } else {
  881.     # Vince's Additions
  882.     
  883.     proc HTMLOptionTitlebar {} {
  884.         global htmlPopUptag
  885.         return [set htmlPopUptag [htmlGetAttributes]]
  886.     }
  887.  
  888.     proc HTMLOptionTitlebarSelect {item} {
  889.         global htmlPopUptag
  890.         if {[lsearch -exact $htmlPopUptag $item] >= 0} {
  891.             htmlInsertAttributes $item
  892.         } else {
  893.             error "Not an attribute."
  894.         }
  895.     }
  896.     
  897.     proc htmlLeftBrace {} {
  898.         global elecLBrace
  899.         set old $elecLBrace
  900.         if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  901.             set elecLBrace 0
  902.         }
  903.         catch {univ::LeftBrace}
  904.         set elecLBrace $old
  905.     }
  906.     proc htmlRightBrace {} {
  907.         global elecRBrace
  908.         set old $elecRBrace
  909.         if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  910.             set elecRBrace 0
  911.         }
  912.         catch {univ::RightBrace}
  913.         set elecRBrace $old
  914.     }
  915. }
  916.  
  917. # ◊◊◊◊ end changing for new system §2 ◊◊◊◊ #
  918.  
  919. if {[info exists cssModeIsLoaded] && $htmlVersion != $cssVersion} {
  920.     alertnote "Warning: The versions of HTML mode and CSS mode may not be compatible.\
  921.         Always install new versions of HTML mode and CSS mode simultaneously."
  922. }
  923.  
  924. set htmlModeIsLoaded 1
  925.  
  926. message "HTML initialization complete."
  927.